package com.briup.jd2407cms.converter;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.ReadConverterContext;
import com.alibaba.excel.converters.WriteConverterContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.baomidou.mybatisplus.extension.api.R;
import com.briup.jd2407cms.domain.Category;
import com.briup.jd2407cms.exception.ServiceException;
import com.briup.jd2407cms.result.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;

import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@Slf4j
public class CategoryParentIdConverter implements Converter<Integer> {

    // 存放父栏目的集合
    public static List<Category> list;

    @Override
    public Class<?> supportJavaTypeKey() {
        return Integer.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        String stringValue = cellData.getStringValue();
        return converterStringToInteger(stringValue);
    }

    @Override
    public Integer convertToJavaData(ReadConverterContext<?> context) throws Exception {
        String stringValue = context.getReadCellData().getStringValue();
        return converterStringToInteger(stringValue);
    }

    @Override
    public WriteCellData<?> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        // value就是读到的数据库中的parentId
        return convertToExcelData(value);
    }

    @Override
    public WriteCellData<?> convertToExcelData(WriteConverterContext<Integer> context) throws Exception {
        return convertToExcelData(context.getValue());
    }


    // ------------ 私有封装方法 ----------------

    /**
     * 导入时：根据excel中父栏目的名字获取其父栏目的id
     * @param value
     * @return
     */
    private Integer converterStringToInteger(String value) {
        if (value != null) {
            //获取所有父栏目的名称
            List<String> names = list.stream().map(Category::getName).collect(Collectors.toList());

            System.out.println("--------"+value);

            //将导入的数据中 父栏目名称 与 数据库中的父栏目名称进行对比,如果存在则继续导入数据,不存在就抛出异常
            if (!names.contains(value)) {
                log.error("使用excel导入栏目时，父栏目id不存在或错误");
                throw new ServiceException(ResultCode.PCATEGORY_IS_INVALID);
            }
            //从集合中根据 父栏目的名称 获取该名称 所对应的父栏目的 id
            Category category= null;
            for(Category c : list){
                if(value.equals(c.getName())){
                    category = c;
                    break;
                }
            }

            return list.get(list.indexOf(category)).getId();
        }
        return null;
    }

    /**
     * 导出时：将数字的父栏目id，转换为excel的字符串
     * @param value
     * @return
     */
    private WriteCellData<?> convertToExcelData(Integer value) {
        //在所有的父栏目中获取 栏目ID 与 待导出数据中父栏目ID 一致的 栏目【ID唯一】
        List<Category> categoryList = list.stream()
                .filter(cate -> Objects.equals(cate.getId(), value))
                .collect(Collectors.toList());
        //如果集合不为空
        if (!categoryList.isEmpty()) {
            //导出的是父栏目的名称
            return new WriteCellData<>(categoryList.get(0).getName());
        }
        //集合为空说明 该栏目为父栏目,直接返回为空
        return new WriteCellData<>("");
    }
}
